// vite-plugin-glb-models.js
import fs from 'fs'
import path from 'path'

export default function glbModelsPlugin() {
  // 配置目录和文件路径
  const modelsDir = 'public/models'
  const imagesDir = 'public/img'
  const outputFile = 'src/models-list.js'

  // 支持的图片扩展名
  const supportedImageExtensions = ['.jpg', '.jpeg', '.png', '.webp', '.gif', '.svg']

  // 生成模型列表的函数
  function generateModelsList() {
    try {
      const absoluteModelsDir = path.resolve(modelsDir)
      const absoluteImagesDir = path.resolve(imagesDir)
      const absoluteOutputFile = path.resolve(outputFile)

      // 确保目录存在
      if (!fs.existsSync(absoluteModelsDir)) {
        fs.mkdirSync(absoluteModelsDir, { recursive: true })
        console.log('创建了models目录')
      }

      if (!fs.existsSync(absoluteImagesDir)) {
        fs.mkdirSync(absoluteImagesDir, { recursive: true })
        console.log('创建了images目录')
      }

      // 读取目录中的所有文件
      const modelFiles = fs.readdirSync(absoluteModelsDir)
      const imageFiles = fs.existsSync(absoluteImagesDir) ? fs.readdirSync(absoluteImagesDir) : []

      // 过滤出GLB文件
      const glbFiles = modelFiles.filter((file) => path.extname(file).toLowerCase() === '.glb')

      // 构建模型列表，包含对应的图片URL
      const modelsList = glbFiles.map((fileName, index) => {
        const baseName = path.basename(fileName, '.glb')

        // 查找匹配的图片文件
        const matchingImage = imageFiles.find((imgFile) => {
          const imgBaseName = path.basename(imgFile, path.extname(imgFile))
          return (
            imgBaseName === baseName &&
            supportedImageExtensions.includes(path.extname(imgFile).toLowerCase())
          )
        })

        // 构建模型对象
        return {
          id: index + 1,
          name: baseName,
          url: `/models/${fileName}`,
          imgUrl: matchingImage ? `/img/${matchingImage}` : null, // 如果找到匹配图片，添加图片URL
        }
      })

      // 生成JavaScript模块内容
      const fileContent = `// 自动生成的模型列表，请勿手动修改
export const modelsList = ${JSON.stringify(modelsList, null, 2)};
`

      // 写入文件
      fs.writeFileSync(absoluteOutputFile, fileContent)
      console.log(`已生成模型列表，共 ${modelsList.length} 个模型`)

      // 输出缺少图片的模型
      const modelsWithoutImages = modelsList.filter((model) => model.imgUrl === null)
      if (modelsWithoutImages.length > 0) {
        console.warn(`警告: ${modelsWithoutImages.length} 个模型没有对应的图片:`)
        modelsWithoutImages.forEach((model) => {
          console.warn(`  - ${model.name}.glb`)
        })
      }
    } catch (error) {
      console.error('生成模型列表失败:', error)
    }
  }

  return {
    name: 'vite-plugin-glb-models',

    buildStart() {
      console.log('构建开始，生成模型列表...')
      generateModelsList()
    },

    configureServer(server) { 
      console.log('开发服务器启动，设置文件监听...')

      // 监听models和images目录变化
      const absoluteModelsDir = path.resolve(modelsDir)
      const absoluteImagesDir = path.resolve(imagesDir)

      server.watcher.add(path.join(absoluteModelsDir, '**'))
      server.watcher.add(path.join(absoluteImagesDir, '**'))

      // 当文件变化时重新生成列表
      const handleFileChange = (file) => {
        const isModelFile = file.includes(modelsDir) && file.endsWith('.glb')
        const isImageFile =
          file.includes(imagesDir) && supportedImageExtensions.some((ext) => file.endsWith(ext))

        if (isModelFile || isImageFile) {
          console.log(`文件变化: ${file}`)
          generateModelsList()
        }
      }

      server.watcher.on('add', handleFileChange)
      server.watcher.on('unlink', handleFileChange)
      server.watcher.on('change', handleFileChange)
    },
  }
}
